#include "hyScript.h"

#include "script.h"
#include <stdexcept>
#include "hex_bin.h"
#include <QDebug>

using namespace SDHuaYi_Script;

HyScript::HyScript()
{
}

int HyScript::add(int a, int b)
{
    qDebug()<<"a+b ="<<a<<"+"<<b<<"="<<a+b;
    return a+b;
}

int HyScript::sub(int a, int b)
{
    qDebug()<<"a-b ="<<a<<"-"<<b<<"="<<a-b;
    return a-b;
}


bool HyScript::load_path(const std::string &script_path, const std::string &cos_path, const std::string &alg_path, const std::string &user_alg_path)
{
    bool ret = 0;
    QString cosFile = QString::fromStdString(cos_path);
    QString scriptFile = QString::fromStdString(script_path);
    QString algFile = QString::fromStdString(alg_path);
    QString userAlgFile = QString::fromStdString(user_alg_path);

qDebug()<<"cosFile:"<<cosFile;
qDebug()<<"scriptFile:"<<scriptFile;
qDebug()<<"algFile:"<<algFile;
qDebug()<<"userAlgFile:"<<userAlgFile;

//qDebug()<<"testest";

//    updataScriptFilePath = scriptFile;
//    updataFirmwareFilePath = cosFile;
//    updataAlgLibFilePath = algFile;
//    updataUserAlgLibFilePath = userAlgFile;

//    try
//    {
//        script newScript = script();
//        newScript.Name = scriptFile;
//        newScript.ScriptSetPC(0);
//        newScript.GetScript(scriptFile);
//    }
//    catch (std::runtime_error &ex)
//    {
//        return false;
//        // throw std::runtime_error(ex.what());
//    }

//    /* 预处理cos固件 */
//    cardReaderDev iReader = cardReaderDev();
//    if (!updataFirmwareFilePath.isEmpty())
//    {
//        Hex_Bin cosfirmware = Hex_Bin(updataFirmwareFilePath, iReader);
//        if (!cosfirmware.Get_Order())
//        {
//            return false;
//            // throw std::runtime_error("解析cos固件失败");
//        }
//    }

//    /* 预处理算法库固件 */
//    if (!updataAlgLibFilePath.isEmpty())
//    {
//        Hex_Bin algfirmware = Hex_Bin(updataAlgLibFilePath, iReader);
//        if (!algfirmware.Get_Order())
//        {
//            return false;
//            // throw std::runtime_error("解析算法库固件失败");
//        }
//    }

//    /* 预处理用户算法库固件 */
//    if (!updataUserAlgLibFilePath.isEmpty())
//    {
//        Hex_Bin userAlgFirmware = Hex_Bin(updataUserAlgLibFilePath, iReader);
//        if (!userAlgFirmware.Get_Order())
//        {
//            return false;
//            // throw std::runtime_error("解析用户算法库固件失败");
//        }
//    }

    return true;
}

void HyScript::execute(ICardReader *creader, const std::string &uid, bool &result, std::string &cos_id, std::string &real_uid)
{
    qDebug()<<"execute";
    /* 创建读卡器 */
//    if (creader == nullptr)
//    {
//        result = false;
//        return;
//    }
//    cardReaderDev iCReader;
//    iCReader.setICardReader(creader);
//    iCReader.CardReset();
//    iCReader.readerType = READER_PCSC;
//    updataOldUid = iCReader.Card.strUID;
//    cos_id = updataOldUid.toStdString();

//    if (uid.empty())
//    {
//        result = false;
//        return;
//    }
//    updataNewUid = QString::fromStdString(uid);

//    // TODO:暂时不做判断
//    // if (updataScriptFilePath.isEmpty())
//    // {
//    //     result = false;
//    //     return;
//    // }
//    // if (updataFirmwareFilePath.isEmpty())
//    // {
//    //     result = false;
//    //     return;
//    // }

//    /* 创建脚本文件 */
//    script newScript = script();
//    newScript.Name = updataScriptFilePath;
//    newScript.ScriptSetPC(0);
//    try
//    {
//        newScript.GetScript(newScript.Name);
//        newScript.Run(iCReader, 0);
//    }
//    catch (std::runtime_error &ex)
//    {
//        throw std::runtime_error(ex.what());
//    }

//    /* 返回新id */
//    real_uid = updataNewUid.toStdString();
    result = true;
}


// 创建脚本对象
HYSCRIPT_EXPORT IScript * __stdcall NewScript()
{
    HyScript *SCRIPT_ptr = new HyScript();
    return SCRIPT_ptr;
}
// 销毁脚本对象
HYSCRIPT_EXPORT void __stdcall DeleteScript(IScript *ptr)
{
    if (!ptr)
    {
        HyScript *ptemp = dynamic_cast<HyScript *>(ptr);
        delete ptemp;
        ptemp = nullptr;
    }
}
//// 创建脚本对象
//HYSCRIPT_EXPORT HyScript *NewScript()
//{
//    HyScript *SCRIPT_ptr = new HyScript();
//    return SCRIPT_ptr;
//}
//// 销毁脚本对象
//HYSCRIPT_EXPORT void DeleteScript(HyScript *ptr)
//{
//    if (!ptr)
//    {
//        HyScript *ptemp = dynamic_cast<HyScript *>(ptr);
//        delete ptemp;
//        ptemp = nullptr;
//    }
//}
